package com.strive.village.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * @Author: strivePeng
 * @CreateTime: 2024年04月19日
 * @Description:
 **/

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    /**
     * @return
     * @description 跨域配置 构建CORS配置的方法
     * @author strivePeng
     */
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 允许所有的来源
        corsConfiguration.addAllowedHeader("*"); // 允许所有的请求头，即请求头中的任何字段都不会被限制
        corsConfiguration.addAllowedMethod("*"); // 允许所有的请求方法，如GET, POST, PUT, DELETE等
        corsConfiguration.addExposedHeader("Authorization");  // 暴露"Authorization"响应头，这样客户端可以访问它
        return corsConfiguration; // 返回配置好的CorsConfiguration对象
    }

    /**
     * 创建并返回一个CorsFilter Bean，该Bean用于处理CORS相关的请求
     *
     * @return CorsFilter对象，用于过滤请求，并应用CORS配置
     */
    @Bean
    public CorsFilter corsFilter() {
        // 创建一个基于URL的CORS配置源
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 注册一个CORS配置到source中，该配置应用于所有路径（"/**"）
        source.registerCorsConfiguration("/**", buildConfig());
        // 创建一个新的CorsFilter，并传入上面配置好的source
        return new CorsFilter(source);
    }

    /**
     * 重写WebMvcConfigurer接口的addCorsMappings方法，用于添加CORS映射
     *
     * @param registry CorsRegistry对象，用于注册CORS配置
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // 添加一个CORS映射，该映射应用于所有路径（"/**"）
        registry.addMapping("/**")
                .allowedOrigins("*") // 允许所有来源的请求
                .allowedMethods("GET", "POST", "DELETE", "PUT")
                .maxAge(3600); // 设置预检请求的有效期，单位为秒，这里设置为3600秒（1小时）
    }
}

